home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / save_tv.exe / SAVE.CPP < prev    next >
C/C++ Source or Header  |  1993-02-24  |  8KB  |  311 lines

  1. //========================================================================
  2. //  The following routines are provided by Borland Technical Support
  3. //  staff.  They are provided as a courtesy and not as part of a Borland
  4. //  product; and, as such, are provided without the assurance of
  5. //  technical support or any specific guarantees.
  6. //========================================================================
  7. //  Turbo Vision - Screen Saver
  8. //
  9. //   - This sample code demonstrates one method to saving a screen via
  10. //     Borland Graphics Interface( BGI ) routines.
  11. //
  12. //  Considerations:
  13. //
  14. //    1) Notice the use of getvect() and setvect() which are used
  15. //       to implement a interrupt service routine, in this case, a counter.
  16. //
  17. //    2) Notice the path for Initgraph(), you may want to use the bgiobj
  18. //       utility and register bgi driver to explictly link in the driver
  19. //       of your choice.  For more information see util.doc.
  20. //
  21. //    3) Once the screen saver is invoked, a keyboard hit is needed to
  22. //       restore the tv screen.
  23. //
  24. //    4) The #define MINUTES sets the number of minutes the application
  25. //        will wait before invoking the screen saver.
  26. //
  27. //==========================================================================
  28. #define Uses_MsgBox
  29. #define Uses_TEventQueue
  30. #define Uses_TEvent
  31. #define Uses_TProgram
  32. #define Uses_TApplication
  33. #define Uses_TKeys
  34. #define Uses_TRect
  35. #define Uses_TMenuBar
  36. #define Uses_TSubMenu
  37. #define Uses_TMenuItem
  38. #define Uses_TStatusLine
  39. #define Uses_TStatusItem
  40. #define Uses_TStatusDef
  41. #define Uses_TDeskTop
  42. #define Uses_TView
  43. #define Uses_TWindow
  44. #define Uses_TFrame
  45. #define Uses_TDialog
  46. #define Uses_TButton
  47. #define Uses_TSItem
  48. #define Uses_TMenu
  49. #define Uses_TObject
  50.  
  51.  
  52. #include <stdlib.h>     //random
  53. #include <conio.h>      //kbhit
  54. #include <graphics.h>   //graphics...
  55. #include <dos.h>        //getvect, setvect
  56. #include <tv.h>
  57.  
  58. #define   ONE_MINUTE   1092        // 18.2 * 60  =  1092
  59. #define   MINUTES         1        // minutes till saver kicks-in
  60. #define PIXEL_COUNT    1000
  61. #define DELAY_TIME      100        // in milliseconds
  62.  
  63.  
  64. const int cmAbout  =    100;
  65.  
  66. class TMyApp : public TApplication
  67. {
  68.   static unsigned counter;
  69.   static void interrupt (*old_1c)(...);       // pointer to a function
  70.   int gdriver, gmode, errorcode;
  71.   int i, x, y, color, maxx, maxy,
  72.        maxcolor, seed;
  73.                           // which takes variable # of
  74. public:                                       // arguments and returns nothing
  75.   TMyApp();
  76.   ~TMyApp();
  77.   static TMenuBar *initMenuBar( TRect );
  78.   static TStatusLine *initStatusLine( TRect );
  79.   void handleEvent(TEvent& event);
  80.   void getEvent(TEvent &);
  81.   void screenSaver();
  82.   void doGraphics();
  83.   Boolean graphicsStart();
  84.   void idle();
  85.   static void interrupt new_1c(...);      //interrupt function needs to be static
  86. };
  87.  
  88.  
  89. //---------------- initialize the static counter -------------------------
  90. unsigned TMyApp::counter = 0;
  91.  
  92. //---------------- initialize the static pointer -------------------------
  93. void interrupt (*TMyApp::old_1c)(...);
  94.  
  95.  
  96. //-------------------------------------------------------------------------
  97. //                          new timer tick isr
  98. //                Increment a counter at each timer tick
  99. //-------------------------------------------------------------------------
  100. void interrupt TMyApp::new_1c(...)
  101. {
  102.    old_1c();
  103.    counter++;
  104. }
  105.  
  106.  
  107. //--------------------------------------------------------------------------
  108. //          Overload getEvent: keep setting the counter back to zero
  109. //          as long as events are happening.
  110. //--------------------------------------------------------------------------
  111. void TMyApp::getEvent(TEvent &ev)
  112. {
  113.     TProgram::getEvent(ev);
  114.     if( ev.what != evNothing )
  115.        counter = 0;
  116. }
  117.  
  118.  
  119. //--------------------------------------------------------------------------
  120. //          Overload idle to check the counter,  call the screen saver
  121. //          after elapsedMinutes.                                                \\
  122. //--------------------------------------------------------------------------
  123. void TMyApp::idle()
  124. {
  125.  
  126.    static unsigned elapsedMinutes = ONE_MINUTE * MINUTES ;  // wait time
  127.  
  128.    TProgram::idle();
  129.  
  130.    if( counter == elapsedMinutes )
  131.    {
  132.       screenSaver();
  133.       counter = 0;
  134.    }
  135.  
  136. }
  137.  
  138.  
  139. //-----------------------------------------------------------------------------
  140. //           If graphics can start, return True... else return False.
  141. //-----------------------------------------------------------------------------
  142. Boolean TMyApp::graphicsStart(void)
  143. {
  144.     gdriver = DETECT;
  145.  
  146.     initgraph( &gdriver, &gmode, "d:\\bc31\\bgi" );
  147.  
  148.     errorcode = graphresult();
  149.  
  150.     if( errorcode != grOk)
  151.        return False;
  152.     else
  153.        return True;
  154.  
  155. }
  156.  
  157.  
  158.  
  159. //----------------------------------------------------------------------------
  160. //          If in graphics mode, call suspend and do the graphics.
  161. //----------------------------------------------------------------------------
  162. void TMyApp::screenSaver()
  163. {
  164.  
  165.  
  166.     if ( !graphicsStart() )
  167.     {
  168.        messageBox("Error Starting Graphics!", mfError );
  169.     }
  170.     else
  171.     {
  172.        suspend();
  173.        doGraphics();
  174.        closegraph();
  175.        resume();
  176.        TProgram::application->redraw();
  177.     }
  178.  
  179.  
  180. }
  181.  
  182.  
  183. //----------------------------------------------------------------------------
  184. //        While no keyboard hit, put colored pixels on the screen.
  185. //----------------------------------------------------------------------------
  186. void TMyApp::doGraphics()
  187. {
  188.  
  189.    maxx = getmaxx() + 1;
  190.    maxy = getmaxy() + 1;
  191.    maxcolor = getmaxcolor() + 1;
  192.  
  193.    cleardevice();
  194.    while (!kbhit())
  195.    {
  196.       //seed the random number generator
  197.       seed = random(32767);
  198.       srand(seed);
  199.       for (i=0; i<PIXEL_COUNT; i++)
  200.       {
  201.      x = random(maxx);
  202.      y = random(maxy);
  203.      color = random(maxcolor);
  204.      putpixel(x, y, color);
  205.       }
  206.  
  207.       delay(DELAY_TIME);
  208.       srand(seed);
  209.       for (i=0; i<PIXEL_COUNT; i++)
  210.       {
  211.      x = random(maxx);
  212.      y = random(maxy);
  213.      color = random(maxcolor);
  214.          if (color == getpixel(x, y))
  215.             putpixel(x, y, 0);
  216.       }
  217.    }
  218.  
  219. }
  220.  
  221.  
  222. //---------------------------------------------------------------------------
  223. //            TMyApp constructor replaces the original interrupt
  224. //            with our new interrupt
  225. //---------------------------------------------------------------------------
  226. TMyApp::TMyApp() :
  227.     TProgInit( &initStatusLine,
  228.            &initMenuBar,
  229.            &initDeskTop
  230.          )
  231. {
  232.     counter = 0;
  233.     void interrupt (*funcP)(...);
  234.     funcP =( void interrupt(*)(...) )&TMyApp::new_1c;
  235.     old_1c = getvect(0x1C);
  236.     setvect(0x1C, funcP );
  237.  
  238. }
  239.  
  240.  
  241. //---------------------------------------------------------------------------
  242. //           TMyApp destructor restores the original interrupt routine
  243. //---------------------------------------------------------------------------
  244. TMyApp::~TMyApp()
  245. {
  246.    setvect(0x1c, old_1c);
  247.    TProgram::~TProgram();
  248. }
  249.  
  250.  
  251. void TMyApp::handleEvent(TEvent& event)
  252. {
  253.  
  254.    TApplication::handleEvent( event );
  255.  
  256.    if( event.what == evCommand )
  257.    {
  258.       switch( event.message.command)
  259.       {
  260.     case cmAbout:
  261.       messageBox("\003Turbo Vision Screen Saver\n\n\003Borland International 1991.",mfInformation);
  262.       break;
  263.  
  264.     default:
  265.       break;
  266.       }
  267.       clearEvent( event );
  268.    }
  269. }
  270.  
  271.  
  272. TStatusLine *TMyApp::initStatusLine(TRect r)
  273. {
  274.    r.a.y = r.b.y - 1;
  275.  
  276.    return new TStatusLine( r,
  277.        *new TStatusDef( 0, 0xFFFF) +
  278.        *new TStatusItem( "~Alt-X~ Exit", kbAltX, cmQuit) +
  279.        *new TStatusItem( "~A~bout Box", kbAltA, cmAbout)
  280.        );
  281.  
  282. }
  283.  
  284.  
  285. TMenuBar *TMyApp::initMenuBar( TRect r )
  286.     r.b.y = r.a.y + 1;
  287.     TMenuBar *t;
  288.  
  289.    TMenuItem *two =
  290.       new TMenuItem("~E~xit", cmQuit, kbAltX);
  291.  
  292.    TMenuItem *one =
  293.       new TMenuItem("~\xF0~", kbAltSpace,
  294.         new TMenu( *new TMenuItem("~A~bout", cmAbout, kbAltA)),
  295.           hcNoContext, two);
  296.  
  297.     return ( new TMenuBar( r, new TMenu( *one ) )  );
  298.  
  299.  
  300. }
  301.  
  302.  
  303. int main()
  304. {
  305.  
  306.     TMyAp